/////////////////////////////////////////////////////////////////////////
// Author: aicy.x
// Date: 2025.1.9
// Brief introduction: 豆包api接入
//////////////////////////////////////////////////////////////////////////
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
//////////////////////
//WiFi
const char* ssid = "xxxxxx";// 定义要连接的Wi-Fi网络名称
const char* password = "xxxxxxxxx";// 定义要连接的Wi-Fi网络密码
/////////////////////
//豆包api
const char* doubao_apiKey = "xxxxxxxxxx";//定义访问相应API（此api由aicy-新 创建，请勿使用）
//////////////////////
//初始文本
String inputText = "你好，小康！";// 定义初始发送给API的文本内容，后续可通过串口输入更新
String apiUrl = "https://ark.cn-beijing.volces.com/api/v3/chat/completions";// 指明要向哪个API端点发送请求，即聊天补全请求的具体网络地址
String answer;// 定义一个字符串类型的全局变量，用于存储从API获取到的回复内容
////////////////////////////
//用于向API发送请求并获取回复，参数inputText是发送给API的文本内容
String getGPTAnswer(String inputText) {
    HTTPClient http;
    http.setTimeout(30000);
    http.begin(apiUrl);
    http.addHeader("Content-Type", "application/json");
    String token_key = "Bearer " + String(doubao_apiKey);
    http.addHeader("Authorization", token_key);

    // 使用ArduinoJSON生成payload
    DynamicJsonDocument doc(2048);
    doc["model"] = "xxxxxxxx";//修改模型
    JsonArray messages = doc.createNestedArray("messages");
    JsonObject systemMsg = messages.createNestedObject();
    systemMsg["role"] = "system";
    systemMsg["content"] = "你是我的AI助手小康，现在我会给你当前心率血氧，还有空气温湿度，你必须用中文给我建议且字数不超过85个";
    JsonObject userMsg = messages.createNestedObject();
    userMsg["role"] = "user";
    userMsg["content"] = inputText;
    doc["temperature"] = 0.3;

    String payload;
    serializeJson(doc, payload);
    //Serial.println("Payload:");
    //Serial.println(payload);

    int httpResponseCode = http.POST(payload);
    if (httpResponseCode == 200) {
        String response = http.getString();
        http.end();
        //Serial.println("Response:");
        //Serial.println(response);
        DynamicJsonDocument jsonDoc(2048);
        deserializeJson(jsonDoc, response);
        String outputText = jsonDoc["choices"][0]["message"]["content"];
        return outputText;
    } else {
        http.end();
        Serial.printf("Error %i \n", httpResponseCode);
        String errorResponse = http.getString();
        Serial.println("Error Response:");
        Serial.println(errorResponse);
        return "<error>";
    }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);//波特率
  WiFi.mode(WIFI_STA);//设置Wi-Fi模式为WIFI_STA，即作为客户端连接到已有的Wi-Fi网络
  WiFi.begin(ssid, password);// 尝试使用之前定义的Wi-Fi名称和密码连接到Wi-Fi网络
  Serial.print("Connecting to WiFi..");// 通过串口打印提示信息，表示正在连接Wi-Fi网络
  while (WiFi.status()!= WL_CONNECTED) {
    Serial.print('.');// 在未连接成功时，通过串口不断打印'.'来表示正在连接的状态
    delay(1000);// 避免过于频繁打印
  }
  Serial.println(WiFi.localIP());// 连接成功后，通过串口打印出设备在该Wi-Fi网络下分配到的本地IP地址
  answer = getGPTAnswer(inputText);// 调用getGPTAnswer函数向API发送初始的inputText请求文本，并将获取到的回复存储到全局变量answer中
    Serial.println("Answer: " + answer);// 通过串口打印出获取到的回复内容
    Serial.println("Enter a prompt:");// 通过串口提示用户可以输入新的请求提示语
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()) {
    // 判断串口是否有可读的数据（有则返回1）
    inputText = Serial.readStringUntil('\r');//读取串口输入的数据，直到遇到回车符'\r'为止
    // inputText.trim();  //去除inputText字符串两端的空白字符
    Serial.println("\n Input:" + inputText);
    answer = getGPTAnswer(inputText);// 调用getGPTAnswer函数向API发送这个新的inputText请求内容，将获取到的回复更新到answer变量中
    Serial.println("Answer: " + answer);// 通过串口打印出获取到的回复内容
    Serial.println("Enter a prompt:");// 通过串口再次提示用户输入新的请求提示语
    }
    // delay(2);
}
